diff --git a/pkg/openstack/instances.go b/pkg/openstack/instances.go
index 758a1b3..a76d91f 100644
--- a/pkg/openstack/instances.go
+++ b/pkg/openstack/instances.go
@@ -24,6 +24,7 @@ import (
 	"regexp"
 	"sort"
 	"strings"
+	stderrors "errors"

 	"github.com/gophercloud/gophercloud"
 	"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/attachinterfaces"
@@ -166,7 +167,9 @@ func (i *Instances) InstanceExists(ctx context.Context, node *v1.Node) (bool, er
 // If false is returned with no error, the instance will be immediately deleted by the cloud controller manager.
 func (i *Instances) InstanceExistsByProviderID(ctx context.Context, providerID string) (bool, error) {
 	instanceID, err := instanceIDFromProviderID(providerID)
-	if err != nil {
+	if stderrors.Is(err, errStaticNode) {
+		return true, nil
+	} else if err != nil {
 		return false, err
 	}

@@ -328,10 +331,15 @@ func isValidLabelValue(v string) bool {
 // If Instances.InstanceID or cloudprovider.GetInstanceProviderID is changed, the regexp should be changed too.
 var providerIDRegexp = regexp.MustCompile(`^` + ProviderName + `:///([^/]+)$`)

+var errStaticNode = stderrors.New("static Node detected")
+
 // instanceIDFromProviderID splits a provider's id and return instanceID.
 // A providerID is build out of '${ProviderName}:///${instance-id}'which contains ':///'.
 // See cloudprovider.GetInstanceProviderID and Instances.InstanceID.
 func instanceIDFromProviderID(providerID string) (instanceID string, err error) {
+	if strings.HasPrefix(providerID, "static://") {
+		return "", errStaticNode
+	}

 	// https://github.com/kubernetes/kubernetes/issues/85731
 	if providerID != "" && !strings.Contains(providerID, "://") {
